/*
 * Licensed to the Tai Ping Jin Ke
 *
 * Copyright (c) 2022 .
 * All rights reserved.
 * 项目名称：太平金科-通用能力封装层-公共组件
 * 版权说明：本软件属太平金融科技服务(上海)有限公司所有，在未获得太平金融科技服务(上海)有限公司正式授权情况下，任何企业和个人，不能获取、阅读、安装、传播本软件涉及的任何受知识产权保护的内容。
 */
package com.taipingframework.utility.thread.threadlocal;

import com.alibaba.ttl.TransmittableThreadLocal;
import org.springframework.web.context.request.RequestAttributes;

/**
 * 实现一个线程安全的TTL
 *
 * ● 在三种情况下request有效：
 * - service函数内
 * - doFilter函数内
 * - startAsync开启的异步线程
 *
 * ● 在以上三种情况之外，使用request会产生不确定的结果(indeterminate results)！
 */
public class TTLRequestContextHolder {

    private static final TransmittableThreadLocal<RequestAttributes> REQUEST_ATTRIBUTES_HOLDER = new TransmittableThreadLocal<>();

    /**
     * 设置请求上下文
     */
    public static void setPoolThreadContext(RequestAttributes requestAttributes) {
        REQUEST_ATTRIBUTES_HOLDER.set(requestAttributes);
    }

    /**
     * 获取请求上下文
     */
    public static RequestAttributes getPoolThreadContext() {
        return REQUEST_ATTRIBUTES_HOLDER.get();
    }

    /**
     * 清除请求上下文
     */
    public static void clearPoolThreadContext() {
        REQUEST_ATTRIBUTES_HOLDER.remove();
    }

}
